package com.example.dllo.exe.fengzhuang;

import android.os.Handler;
import android.os.Looper;

import com.example.dllo.exe.main.MyApp;
import com.example.dllo.exe.bean.SQLGongLueBean;
import com.litesuits.orm.LiteOrm;
import com.litesuits.orm.db.assit.QueryBuilder;

import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * code is far away from bug with the animal protecting
 * <p/>
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃永无BUG！  凯哥 祝你一路顺风
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 * 数据库的操作类
 * 使用单例模式,因为LiteOrm的要求
 */
public class DBTool {

    private static DBTool test;
    private LiteOrm mLiteOrm;
    //Handler用来做线程切换,为了在主线程来执行回调,返回数据
    private Handler mHandler;
    //线程池
    ExecutorService threadPool = Executors.newFixedThreadPool(5);

    //liteOrm对象,增删改查的方法,都操作此对象
    public static DBTool getInstance() {
        if (test == null) {
            synchronized (DBTool.class) {
                if (test == null) {
                    test = new DBTool();
                }
            }
        }
        return test;
    }

    public DBTool() {
        //初始化liteorm对象
        //使用MyAPP里的全局Context
        //第二个参数是 数据库的名字
        mLiteOrm = LiteOrm.newCascadeInstance(MyApp.getContext(), "MyDataBase.db");
        //初始化Handler
        //Handler的构造方法 参数如果传
        //Looper.getMainLooper()
        //代表这个Handler一定回调到主线程
        //属于严谨的写法
        mHandler = new Handler(Looper.getMainLooper());

    }

    //向数据库插入一个学生
    public void insertStudent(SQLGongLueBean sqlGongLueBean) {
        mLiteOrm.insert(sqlGongLueBean);

    }
    public void deleteStudent(String title){

        queryGoodStudent(new QueryListener() {
            @Override
            public void onQueryComplete(ArrayList<SQLGongLueBean> songs) {
                for (SQLGongLueBean song : songs) {
                    mLiteOrm.delete(song);
                }
//                mLiteOrm.delete(songs.get(0));
            }
        },title);
    }
    //查询所有学生
    //参数 需要一个接口对象 ,当查询成功之后
    //调用接口对象的方法,来把数据返回回去
    public void queryAllStudent(final QueryListener queryListener) {
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                //在子线程中查询数据库,查询的结果是students
                final ArrayList<SQLGongLueBean> sqlGongLueBeen;
                sqlGongLueBeen= mLiteOrm.query(SQLGongLueBean.class);
                //把数据传递过去

//                queryListener.onQueryComplete(querry);

                //查询成功后,使用handler在主线程回调接口对象
                //handler 通过post方法 接收一个Runnable()对象
                // 会使该对象的run()方法 强制在主线程中执行
//                mHandler.post(new Runnable() {
//                    @Override
//                    public void run() {
//                        queryListener.onQueryComplete(querry);
//                    }
//                });
                mHandler.post(new HandlerRunnable(sqlGongLueBeen, queryListener));
            }
        });

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//
//            }
//        }).start();
    }

    //使用接口  来达到间数据同步的返回出去
    public interface QueryListener {
        void onQueryComplete(ArrayList<SQLGongLueBean> sqlGongLueBeen);
    }
    //查询及格的学生
    private void  queryGoodStudent(final QueryListener queryListener, final String title){
        threadPool.execute(new Runnable() {
            @Override
            public void run() {
                //条件查询
                QueryBuilder<SQLGongLueBean> builder=new QueryBuilder<SQLGongLueBean>(SQLGongLueBean.class);
                builder.where(" title = ? ",title);//加入条件
               ArrayList<SQLGongLueBean> sqlGongLueBeen= mLiteOrm.query(builder);
               //放到主线程回调
                mHandler
                        .post(new HandlerRunnable(sqlGongLueBeen,queryListener));
            }
        });
    }
    //写一个类,作为handler的Runnable
    class HandlerRunnable implements Runnable {
        ArrayList<SQLGongLueBean> sqlGongLueBeen;
        QueryListener mQueryListener;
        //构造方法


        public HandlerRunnable(ArrayList<SQLGongLueBean> mStudents, QueryListener mQueryListener) {
            this.sqlGongLueBeen = mStudents;
            this.mQueryListener = mQueryListener;
        }

        @Override
        public void run() {
            mQueryListener.onQueryComplete(sqlGongLueBeen);
        }
    }
}